﻿/*

 REAMMO_CARGO.SQF © Pumpkin V2.0
 ----------------

 Remplissage de container universel; rempli avec toutes les armes disponibles dans le jeu, quelque soit les addons installés.
 Le script détecte les munitions utilisé par chaque arme et les ajoute au container.

 * Possibilité de filtrage
  > soit en indiquant le numéro du slot correspondant au type d'arme (voir ci-dessous) : un numéro positif remplira le container
    uniquement avec les armes de ce type. Un numéro négatif retirera les armes de ce type et laissera toutes les autres

  > soit en indiquant l'indicatif de la table prédéfinie :
 	"a2e" pour se limiter aux armes basiques de ArmA2 et utilisées par le camp EST
 	"a2w" pour se limiter aux armes basiques de ArmA2 et utilisées par le camp OUEST
 	"oae" pour se limiter aux armes d'Opération Arrowhead et utilisées par le camp EST
 	"oaw" pour se limiter aux armes d'Opération Arrowhead et utilisées par le camp OUEST
 	"baf" pour se limiter aux armes de British Armed Force
 	"pmc" pour se limiter aux armes de Private Military Company

    un signe "-" devant l'indicatif retire les armes de l'ensemble du contenu :
 	"-a2e" pour retirer les armes basiques de ArmA2, camp EST
 	"-a2w" pour retirer les armes basiques de ArmA2, camp OUEST
 	"-oae" pour retirer les armes d'Opération Arrowhead, camp EST
 	"-oaw" pour retirer les armes d'Opération Arrowhead, camp OUEST
 	"-baf" pour retirer les armes de British Armed Force
 	"-pmc" pour retirer les armes de Private Military Company

 * Le script ajoute également 2 sacs à dos de chaque type existants dans le jeu (filtré grâce au numéro 40000)

 * Les filtres peuvent se cumuler : on peut utiliser conjointement le filtrage par numéro de slot et l'indicatif de table (voir les exemples)

 Paramètres:
 ===========
 nul = [nom_du_container (,filtres optionnels)] execVM "lib\Rearm_Cargo_w.sqf"

 exemples :
 ==========
 nul = [this] execVM "lib\Rearm_Cargo_w.sqf" : rempli avec toutes les armes et munitions en quantité par défaut
 nul = [this, 20] execVM "lib\Rearm_Cargo_w.sqf" : rempli avec toutes les armes et munitions avec 20 armes de chaque et assez de chargeurs
 nul = [this, 20, 1] execVM "lib\Rearm_Cargo_w.sqf" : rempli avec toutes les armes et munitions avec 20 armes de chaque et assez de chargeurs et réitère le remplissage toutes les 5 minutes
 nul = [this, 20, 0, 1] execVM "lib\Rearm_Cargo_w.sqf" : ne rempli qu'avec les fusils avec 20 fusils de chaque et ne re-rempli pas
 nul = [this, -1, 0, 1, 2] execVM "lib\Rearm_Cargo_w.sqf" : ne rempli qu'avec les fusils et les armes de poings en quantité par défaut
 nul = [this, 20, 0, -4] execVM "lib\Rearm_Cargo_w.sqf" : rempli avec toutes les armes, sauf les lances-roquettes avec 20 de chaque
 nul = [this, 20, 0, -4, -4096] execVM "lib\Rearm_Cargo_w.sqf" : rempli avec toutes les armes, sauf les lances-roquettes et les jumelles
 nul = [this, 20, 0, "a2w", "oaw", 2] execVM "lib\Rearm_Cargo_w.sqf" : ne rempli qu'avec les fusils de ArmA2 et de OA du camp OUEST
 nul = [this, 20, 0, "a2e", "oae", -5] execVM "lib\Rearm_Cargo_w.sqf" : ne rempli qu'avec les armes de ArmA2 et de OA du camp EST, sauf les mitrailleuses lourdes


 NUMERO SLOTS:
 =============
 1 : fusils
 2 : armes de poing
 4 : lances-roquette
 5 (= 4+1) : mitrailleuses lourdes
 4096 : jumelles, JVN,...
 65536 : "hard mounted", armes fixées sur véhicules
 131072 : items (photos, preuves,... + gps, carte,...)

 200000 : (ARBITRAIRE!) utilisé pour les armes de jet et bombes
 400000 : (ARBITRAIRE!) utilisé pour les sac à dos
*/


#include "wpns_arrays\wpns_a2_w.sqf"
#include "wpns_arrays\wpns_a2_e.sqf"
#include "wpns_arrays\wpns_oa_w.sqf"
#include "wpns_arrays\wpns_oa_e.sqf"
#include "wpns_arrays\wpns_baf_w.sqf"
#include "wpns_arrays\wpns_pmc.sqf"

_coefwpn = 0.2;
_coefmag = 5;

// liste des armes exclus
_wpns_exclude = [
	"AKS_GOLD",
	"revolver_gold_EP1",

	"Kostey_photos",
	"Kostey_map_case",
	"Kostey_notebook",
	"CDF_dogtags",
	"Moscow_Bombing_File",
	"Cobalt_File",
	"EvPhoto",
	"EvMap",
	"EvMoscow",
	"EvKobalt",
	"EvMoney",
	"EvDogTags",

	"pmc_documents"
];

// liste des munitions exclus

	//"HandGrenade",
	//"MineE",
	//"IRStrobe",
	//"IR_Strobe_Marker",
_mags_exclude = [
	"HandGrenade_Stone",
	"TimeBomb"
];

diag_log Format["%1 RearmCargo", diag_tickTime];

_fill_crate = {

	_wpns = _this select 0;
	_inbox_wpns = [];
	_inbox_mags = [];
	_iElCount = 0;
	diag_log Format["%2 Start Fill Crate: %1", count _wpns, diag_tickTime];
	for [{_i = 0},{_i < (count _wpns)},{_i = _i + 1}] do {
		_weap = _wpns select _i;
		_slot = getNumber (configFile >> "cfgWeapons" >> _weap >> "type");

		_weaponflag = true;
		If (_slot == 0 ) then {
			_weaponflag = false;
		} else {
			if ( (not (_slot in _slots_include)) and ((count _slots_include) > 0) ) then { _weaponflag = false };
			if ( (_slot in _slots_exclude) and ((count _slots_exclude) > 0) ) then { _weaponflag = false };
		};
		if (_weaponflag) then {

			if (_slot == 5) then {_slot = 1};
			_nbwpns = round (exp (2.3 / _slot));
			if ((_slot >= 4096) or (_slot == 0)) then { _slot = 1 };

			// Ajout de l'arme
			if (not (_weap in _inbox_wpns)) then {
				_box addweaponcargo [_weap, ceil (_nbwpns * _coefwpn)];
				_iElCount = _iElCount + 1;
				_inbox_wpns = _inbox_wpns + [_weap];
			};

			// Ajout des munitions par défaut (= muzzle 0)
			_wpncfg = configFile >> "CfgWeapons" >> _weap;
			_cfgmags = getArray (_wpncfg >> "magazines");
			if (count _cfgmags > 0) then {
				for "_k" from 0 to ((count _cfgmags) - 1) do {
					_mag = _cfgmags select _k;
					if (not (_mag in _inbox_mags)) then {
						_box addMagazineCargo [_mag, round (_nbwpns * _coefmag)];
						_iElCount = _iElCount + 1;
						_inbox_mags = _inbox_mags + [_mag];
					};
					sleep 0.02;
				};
			};

			// Ajout des munitions secondaire (= muzzle 1+)
			_wpnmuzzles = getArray (_wpncfg >> "muzzles");
			// _wpnmuzzles > 1 car le 1er est systèmatiquement le muzzle de l'arme principale
			if (count _wpnmuzzles > 1) then {
				for "_m" from 1 to ((count _wpnmuzzles) - 1) do {
					_muzzlmags = getArray(configFile >> "cfgWeapons" >> _weap >> (_wpnmuzzles select 1) >> "magazines");
					for "_p" from 0 to ((count _muzzlmags) - 1) do {
						_mag = _muzzlmags select _p;
						if (not (_mag in _inbox_mags)) then {
							_box addMagazineCargo [_mag, round (_nbwpns * _coefmag)];
							_iElCount = _iElCount + 1;
							_inbox_mags = _inbox_mags + [_mag];
						};
						sleep 0.02;
					};
					sleep 0.03;
				};
			};

		};
		sleep 0.03;
	};
	diag_log Format["%2 Finish Fill Crate: %1", _iElCount, diag_tickTime];
};


// DEBUT TRAITEMENT

sleep 2;

_params = _this;
_box = _this select 0;

_amount = 2;
If (count _this > 1) then { _amount = _this select 1 };
If (_amount < 2) then { _amount = 2 }; 
_refill = 0;
If (count _this > 2) then { _refill = _this select 2 };

_coefwpn = 0.1 * _amount;
_coefmag = 2.5 * _amount;

// Créer la table de toutes les armes "publiques"
_alltheweapons = [];

_allwpns = configFile >> "CfgWeapons";
for "_a" from 1 to ((count _allwpns) - 1) do {
	_base = configFile >> "CfgWeapons";
	_wpn = (_base select _a);
	if (getNumber(_wpn >> "scope") == 2) then {
		_slot = getNumber(_wpn >> "type");

		// Exculsion des "hard mounted"
		if (_slot != 65536) then {
			_cfgtbl = toArray (format ["%1",_wpn]);
			_nametbl = [];
			// Elimination de la chaine "BIN\CONFIG.BIN/CFGWEAPONS/"
			for "_s" from 26 to ((count _cfgtbl) - 1) do { _nametbl = _nametbl + [_cfgtbl select _s] };
			_name = toString _nametbl;
			_alltheweapons = _alltheweapons + [_name];
		};
	};
	sleep 0.02;
};


_slots_include = [];
_slots_exclude = [];
_wpnsarray = [];
_excludearray = [];

// Extraction des filtres
If (count _this > 3) then {
	for "_p" from 3 to ((count _params) - 1) do {

		_soloprm  = _params select _p;

		// Filtre selon les slots
		if (typename _soloprm == "SCALAR") then {
			if (_soloprm >= 0) then { _slots_include = _slots_include + [_soloprm] } else { _slots_exclude = _slots_exclude + [abs _soloprm] };
		};

		// Filtre selon les tables prédéfinies (voir includes/répertoires "wpns_arrays\"); remplissage "à l'ancienne"
		if (typename _soloprm == "STRING") then {
			Switch (_soloprm) do {
				case "a2e": {
					_wpnsarray = _wpnsarray + _wpns_a2_e;
				};
				case "a2w": {
					_wpnsarray = _wpnsarray + _wpns_a2_w;
				};
				case "oae": {
					_wpnsarray = _wpnsarray + _wpns_oa_e;
				};
				case "oaw": {
					_wpnsarray = _wpnsarray + _wpns_oa_w;
				};
				case "baf": {
					_wpnsarray = _wpnsarray + _wpns_baf_w;
				};
				case "pmc": {
					_wpnsarray = _wpnsarray + _wpns_pmc;
				};


				case "-a2e": {
					_excludearray = _excludearray + _wpns_a2_e;
				};
				case "-a2w": {
					_excludearray = _excludearray + _wpns_a2_w;
				};
				case "-oae": {
					_excludearray = _excludearray + _wpns_oa_e;
				};
				case "-oaw": {
					_excludearray = _excludearray + _wpns_oa_w;
				};
				case "-baf": {
					_excludearray = _excludearray + _wpns_baf_w;
				};
				case "-pmc": {
					_excludearray = _excludearray + _wpns_pmc;
				};
			};
		};
	};
};


if (count _wpnsarray > 0) then { _alltheweapons = _wpnsarray };
if (count _excludearray > 0) then { _alltheweapons = _alltheweapons - _excludearray };

// Retrait des armes "exotiques" ou buggée
_alltheweapons = _alltheweapons - _wpns_exclude;

// Teste l'ajout ou non des armes de jet ou bombes
if ( (20000 in _slots_include) or (not (20000 in _slots_exclude)) ) then {
	_alltheweapons = _alltheweapons + ["put","throw"];
	if (count _slots_include > 0) then { _slots_include = _slots_include + [0] };
};

_bFillCrate = true;

while { _bFillCrate } do {
	clearmagazinecargo _box;
	clearweaponcargo _box;

	// Remplissage de la caisse
	[_alltheweapons] call _fill_crate;

	// Teste l'ajout des sac à dos
	// if ( (40000 in _slots_include) or (not (40000 in _slots_exclude)) ) then {
		// diag_log Format["Adding Backpacks"];

		// _allvehs = configFile >> "cfgVehicles";

		// for "_b" from 1 to ((count _allvehs) - 1) do {

			// _vehbase = _allvehs select _b;

			// if (getNumber(_vehbase >> "isbackpack") == 1) then {
				// if (getNumber(_vehbase >> "scope") == 2) then {
					// _bagnum = getNumber(_vehbase >> "transportMaxMagazines");
					// if (getNumber(_vehbase >> "transportMaxMagazines") > 0) then {
						// _cfgtbl = toArray (format ["%1",_vehbase]);
						// _nametbl = [];
						// // Elimination de la chaine "BIN\CONFIG.BIN/CFGVEHICLES/"
						// for "_s" from 27 to ((count _cfgtbl) - 1) do { _nametbl = _nametbl + [_cfgtbl select _s] };
						// _name = toString _nametbl;

						// _box addBackpackCargo [_name, 2];
					// };
				// };
			// };
		// };
	// };
	
	If ( _refill > 0 ) then {
		diag_log Format["Wait for next filling"];
		sleep 600; 
	} else {
		_bFillCrate = false;
	};
};
